在資料查詢或應用大量數據時,將資料分頁顯示並按照需求排序是常見的,在Spring Boot當中,可透過內建的Pageable以及Sort介面,輕鬆與Spring Data JPA結合,簡化開發過程,快速實現。
@Entity
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Date taskDate;
// getters and setters
}
public interface TaskRepository extends JpaRepository<Task, Long> {
}
@RestController
public class TaskController {
private final TaskRepository taskRepository;
public TaskController(TaskRepository taskRepository) {
this.taskRepository = taskRepository;
}
@GetMapping("/tasks")
public Map<String, Object> getTasks(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "name") String sortBy) {
// 分頁與排序
Pageable pageable = PageRequest.of(page, size, Sort.by(sortBy));
Page<Task> tasksPage = taskRepository.findAll(pageable);
// 取得分頁中的資料
List<Task> tasks = tasksPage.getContent();
int totalPages = tasksPage.getTotalPages();
long totalItems = tasksPage.getTotalElements();
int currentPage = tasksPage.getNumber();
// 封裝結果到Map,返回JSON格式
Map<String, Object> response = new HashMap<>();
response.put("tasks", tasks); // 當前頁數據
response.put("currentPage", currentPage); // 當前頁碼
response.put("totalItems", totalItems); // 總條數
response.put("totalPages", totalPages); // 總頁數
// 如果不封裝,Spring Boot會返回所有Page對象相關數據
return response; // 以JSON格式返回
}
}
調用tasks API時,返回的JSON格式:
{
"tasks": [
{
"id": 1,
"name": "Task 1",
"taskDate": "2024-10-07"
},
{
"id": 2,
"name": "Task 2",
"taskDate": "2024-10-08"
}
],
"currentPage": 0,
"totalItems": 50,
"totalPages": 5
}
預設值
使用 defaultValue 可指定 page、size、sortBy 預設值。
多重排序
sort可用於多個字段排序,例如:
Sort sort = Sort.by("name").ascending().and(Sort.by("taskDate").descending());
Pageable pageable = PageRequest.of(page, size, sort);
// 可以同時根據名稱升序和日期降序進行排序。
排序分頁功能是來自Spring Data JPA,同樣並非Spring Boot獨有,而是省去繁瑣配置,能快速上手應用,適合多種web場景,同時也能方便前端處理分頁和顯示數據,方便擴展排序或其他過濾條件。